home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
term-source.lha
/
Matrix.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-20
|
18KB
|
837 lines
/*
** Matrix.c
**
** Single character entry
**
** Copyright © 1990-1996 by Olaf `Olsen' Barthel
** All Rights Reserved
**
** :ts=4
*/
#ifndef _GLOBAL_H
#include "Global.h"
#endif
#define MIA_CellWidth (TAG_USER+0x70000)
#define MIA_CellHeight (TAG_USER+0x70001)
#define MIA_Width (TAG_USER+0x70002)
#define MIA_Height (TAG_USER+0x70003)
#define MIA_Labels (TAG_USER+0x70004)
#define MIA_NumLabels (TAG_USER+0x70005)
#define MIA_Font (TAG_USER+0x70006)
#define MIA_Index (TAG_USER+0x70007)
typedef struct MatrixInfo
{
UWORD CellWidth,
CellHeight;
UWORD Width,
Height;
UWORD PixelWidth,
PixelHeight;
WORD CurrentX,
CurrentY;
STRPTR *Labels;
LONG NumLabels;
struct TextFont *Font;
} MatrixInfo;
STATIC Class *MatrixClass;
STATIC Object *MatrixGadget;
STATIC UBYTE TitleBuffer[256];
STATIC VOID
DrawCellText(struct RastPort *RPort,LONG Left,LONG Top,LONG Width,LONG Height,STRPTR Label)
{
struct TextExtent Extent;
LONG Len;
if(Len = TextFit(RPort,Label,strlen(Label),&Extent,NULL,1,Width,32767))
PlaceText(RPort,Left + (Width - Extent.te_Width) / 2,Top + (Height - Extent.te_Height) / 2,Label,Len);
}
STATIC VOID
DrawCell(struct RastPort *RPort,LONG PixelLeft,LONG PixelTop,UWORD *Pens,MatrixInfo *Info,LONG x,LONG y,BOOL Highlight)
{
UWORD Shine,Shadow,Text,Fill;
LONG Left,Top;
LONG Index;
Left = PixelLeft + Info->CellWidth * x;
Top = PixelTop + Info->CellHeight * y;
if(Highlight)
{
Shine = SHADOWPEN;
Shadow = SHINEPEN;
Text = FILLTEXTPEN;
Fill = FILLPEN;
}
else
{
Shine = SHINEPEN;
Shadow = SHADOWPEN;
Text = TEXTPEN;
Fill = BACKGROUNDPEN;
}
SetDrMd(RPort,JAM1);
SetAPen(RPort,Pens[Shine]);
Move(RPort,Left,Top + Info->CellHeight - 1);
Draw(RPort,Left,Top);
Draw(RPort,Left + Info->CellWidth - 1,Top);
SetAPen(RPort,Pens[Shadow]);
Move(RPort,Left + 1,Top + Info->CellHeight - 1);
Draw(RPort,Left + Info->CellWidth - 1,Top + Info->CellHeight - 1);
Draw(RPort,Left + Info->CellWidth - 1,Top + 1);
SetAPen(RPort,Pens[Fill]);
RectFill(RPort,Left + 1,Top + 1,Left + Info->CellWidth - 2,Top + Info->CellHeight - 2);
if((Index = y * Info->Width + x) < Info->NumLabels)
{
SetAPen(RPort,Pens[Text]);
DrawCellText(RPort,Left + 1,Top + 1,Info->CellWidth - 2,Info->CellHeight - 2,Info->Labels[Index]);
}
}
STATIC VOID
DrawGrid(struct RastPort *RPort,LONG PixelLeft,LONG PixelTop,UWORD *Pens,MatrixInfo *Info)
{
LONG i,j,Left,Top,Bottom,Strange,Charm;
SetDrMd(RPort,JAM1);
Left = PixelLeft;
Top = PixelTop;
Bottom = PixelTop + Info->PixelHeight - 1;
Strange = Pens[SHINEPEN];
Charm = Pens[SHADOWPEN];
for(i = 0 ; i < Info->Width ; i++)
{
SetAPen(RPort,Strange);
Move(RPort,Left,Top);
Draw(RPort,Left,Bottom);
Left += Info->CellWidth;
SetAPen(RPort,Charm);
Move(RPort,Left - 1,Top);
Draw(RPort,Left - 1,Bottom);
}
Top = PixelTop;
for(j = 0 ; j < Info->Height ; j++)
{
Left = PixelLeft;
for(i = 0 ; i < Info->Width ; i++)
{
SetAPen(RPort,Strange);
Move(RPort,Left,Top);
Draw(RPort,Left + Info->CellWidth - 1,Top);
SetAPen(RPort,Charm);
Move(RPort,Left + 1,Top + Info->CellHeight - 1);
Draw(RPort,Left + Info->CellWidth - 2,Top + Info->CellHeight - 1);
Left += Info->CellWidth;
}
Top += Info->CellHeight;
}
}
STATIC VOID
NotifyIndex(Class *class,Object *object,struct GadgetInfo *GInfo,struct opUpdate *msg,LONG Index)
{
struct TagItem Tags[3];
Tags[0].ti_Tag = MIA_Index;
Tags[0].ti_Data = Index;
Tags[1].ti_Tag = GA_ID;
Tags[1].ti_Data = ((struct Gadget *)object)->GadgetID;
Tags[2].ti_Tag = TAG_DONE;
DoSuperMethod(class,object,OM_NOTIFY,Tags,GInfo,((msg->MethodID == OM_UPDATE) ? (msg->opu_Flags) : 0L));
}
STATIC BOOL
SetMethod(Class *class,Object *object,struct opSet *SetInfo)
{
struct TagItem *Tag;
MatrixInfo *Info;
Info = INST_DATA(class,object);
if(Tag = FindTagItem(MIA_Index,SetInfo->ops_AttrList))
{
struct RastPort *RPort;
if(RPort = ObtainGIRPort(SetInfo->ops_GInfo))
{
UWORD *Pens;
LONG Index;
Index = (LONG)Tag->ti_Data;
Pens = SetInfo->ops_GInfo->gi_DrInfo->dri_Pens;
SetFont(RPort,Info->Font);
if(Info->CurrentX != -1 && Info->CurrentY !=-1)
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,Pens,Info,Info->CurrentX,Info->CurrentY,FALSE);
if(Index >= 0 && Index < Info->Width * Info->Height)
{
Info->CurrentX = Index % Info->Width;
Info->CurrentY = Index / Info->Width;
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,Pens,Info,Info->CurrentX,Info->CurrentY,TRUE);
NotifyIndex(class,object,SetInfo->ops_GInfo,(struct opUpdate *)SetInfo,Index);
}
else
{
Info->CurrentX = Info->CurrentY = -1;
NotifyIndex(class,object,SetInfo->ops_GInfo,(struct opUpdate *)SetInfo,-1);
}
ReleaseGIRPort(RPort);
return(TRUE);
}
}
return(FALSE);
}
STATIC ULONG
RenderMethod(Class *class,Object *object,struct gpRender *RenderInfo)
{
LONG i,x,y,Left,Top;
MatrixInfo *Info;
UWORD *Pens;
Info = INST_DATA(class,object);
Pens = RenderInfo->gpr_GInfo->gi_DrInfo->dri_Pens;
SetFont(RenderInfo->gpr_RPort,Info->Font);
Left = ((struct Gadget *)object)->LeftEdge;
Top = ((struct Gadget *)object)->TopEdge;
SetAPen(RenderInfo->gpr_RPort,Pens[BACKGROUNDPEN]);
FillBox(RenderInfo->gpr_RPort,Left,Top,((struct Gadget *)object)->Width,((struct Gadget *)object)->Height);
DrawGrid(RenderInfo->gpr_RPort,Left,Top,Pens,Info);
SetAPen(RenderInfo->gpr_RPort,Pens[TEXTPEN]);
for(i = 0 ; i < Info->NumLabels ; i++)
{
x = (i % Info->Width) * Info->CellWidth;
y = (i / Info->Width) * Info->CellHeight;
DrawCellText(RenderInfo->gpr_RPort,Left + x,Top + y,Info->CellWidth,Info->CellHeight,Info->Labels[i]);
}
return(TRUE);
}
STATIC VOID
DisposeMethod(Class *class,Object *object,Msg UnusedMsg)
{
MatrixInfo *Info = INST_DATA(class,object);
if(Info->Font)
CloseFont(Info->Font);
}
STATIC ULONG
NewMethod(Class *class,Object *object,struct opSet *SetInfo)
{
if(object = (Object *)DoSuperMethodA(class,object,(Msg)SetInfo))
{
struct TagItem *Tag,*TagList;
LONG Width,Height;
MatrixInfo *Info;
struct TextAttr *Font;
Info = INST_DATA(class,object);
TagList = SetInfo->ops_AttrList;
Width = 0;
Height = 0;
Font = NULL;
memset(Info,0,sizeof(MatrixInfo));
while(Tag = NextTagItem(&TagList))
{
switch(Tag->ti_Tag)
{
case MIA_CellWidth:
Info->CellWidth = Tag->ti_Data;
break;
case MIA_CellHeight:
Info->CellHeight = Tag->ti_Data;
break;
case MIA_Width:
Info->Width = Tag->ti_Data;
break;
case MIA_Height:
Info->Height = Tag->ti_Data;
break;
case MIA_Labels:
Info->Labels = (STRPTR *)Tag->ti_Data;
break;
case MIA_NumLabels:
Info->NumLabels = Tag->ti_Data;
break;
case MIA_Font:
Font = (struct TextAttr *)Tag->ti_Data;
break;
case GA_Width:
Width = Tag->ti_Data;
break;
case GA_Height:
Height = Tag->ti_Data;
break;
}
}
if(Info->Labels && !Info->NumLabels)
{
while(Info->Labels[Info->NumLabels])
Info->NumLabels++;
}
if(Font && Info->CellWidth && Info->CellHeight)
{
if(!Info->Width)
Info->Width = Width / Info->CellWidth;
if(!Info->Height)
Info->Height = Height / Info->CellHeight;
if(Info->Width && Info->Height)
{
if(Info->Font = OpenFont(Font))
{
Info->CurrentX = -1;
Info->CurrentY = -1;
Info->PixelWidth = Info->Width * Info->CellWidth;
Info->PixelHeight = Info->Height * Info->CellHeight;
return((ULONG)object);
}
}
}
CoerceMethod(class,object,OM_DISPOSE);
}
return(0);
}
STATIC ULONG
InputMethod(Class *class,Object *object,struct gpInput *InputInfo)
{
MatrixInfo *Info;
ULONG Result;
UWORD *Pens;
BOOL Done;
LONG x,y;
Info = INST_DATA(class,object);
Result = GMR_MEACTIVE;
Pens = InputInfo->gpi_GInfo->gi_DrInfo->dri_Pens;
Done = FALSE;
if(InputInfo->gpi_IEvent->ie_Class == IECLASS_RAWMOUSE)
{
if(InputInfo->gpi_IEvent->ie_Code == MENUDOWN)
{
Result = GMR_NOREUSE;
Done = TRUE;
}
else
{
if(InputInfo->gpi_IEvent->ie_Code == SELECTUP)
{
Done = TRUE;
if(Info->CurrentX != -1 && Info->CurrentY != -1)
{
Result = GMR_REUSE | GMR_VERIFY;
*InputInfo->gpi_Termination = Info->CurrentY * Info->Width + Info->CurrentX;
}
else
Result = GMR_NOREUSE;
}
}
if(Done && Info->CurrentX != -1 && Info->CurrentY != -1)
{
struct RastPort *RPort;
if(RPort = ObtainGIRPort(InputInfo->gpi_GInfo))
{
SetFont(RPort,Info->Font);
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,Pens,Info,Info->CurrentX,Info->CurrentY,FALSE);
Info->CurrentX = -1;
Info->CurrentY = -1;
ReleaseGIRPort(RPort);
NotifyIndex(class,object,InputInfo->gpi_GInfo,(struct opUpdate *)InputInfo,-1);
}
}
}
if(!Done)
{
x = InputInfo->gpi_Mouse.X / Info->CellWidth;
y = InputInfo->gpi_Mouse.Y / Info->CellHeight;
if(InputInfo->gpi_Mouse.X < 0 || InputInfo->gpi_Mouse.Y < 0 || x >= Info->Width || y >= Info->Height)
x = y = -1;
if(x != Info->CurrentX || y != Info->CurrentY)
{
struct RastPort *RPort;
if(RPort = ObtainGIRPort(InputInfo->gpi_GInfo))
{
SetFont(RPort,Info->Font);
if(Info->CurrentX != -1 && Info->CurrentY != -1)
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,Pens,Info,Info->CurrentX,Info->CurrentY,FALSE);
Info->CurrentX = x;
Info->CurrentY = y;
if(x != -1 && y != -1)
{
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,Pens,Info,Info->CurrentX,Info->CurrentY,TRUE);
NotifyIndex(class,object,InputInfo->gpi_GInfo,(struct opUpdate *)InputInfo,y * Info->Width + x);
}
else
NotifyIndex(class,object,InputInfo->gpi_GInfo,(struct opUpdate *)InputInfo,-1);
ReleaseGIRPort(RPort);
}
}
}
return(Result);
}
STATIC ULONG
ActiveMethod(Class *class,Object *object,struct gpInput *InputInfo)
{
struct RastPort *RPort;
if(RPort = ObtainGIRPort(InputInfo->gpi_GInfo))
{
MatrixInfo *Info;
UWORD *Pens;
Info = INST_DATA(class,object);
Pens = InputInfo->gpi_GInfo->gi_DrInfo->dri_Pens;
SetFont(RPort,Info->Font);
if(Info->CurrentX != -1 && Info->CurrentY !=-1)
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,Pens,Info,Info->CurrentX,Info->CurrentY,FALSE);
Info->CurrentX = InputInfo->gpi_Mouse.X / Info->CellWidth;
Info->CurrentY = InputInfo->gpi_Mouse.Y / Info->CellHeight;
if(Info->CurrentX > Info->Width - 1)
Info->CurrentX = Info->Width - 1;
else
{
if(Info->CurrentX < 0)
Info->CurrentX = 0;
}
if(Info->CurrentY > Info->Height - 1)
Info->CurrentY = Info->Height - 1;
else
{
if(Info->CurrentY < 0)
Info->CurrentY = 0;
}
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,Pens,Info,Info->CurrentX,Info->CurrentY,TRUE);
NotifyIndex(class,object,InputInfo->gpi_GInfo,(struct opUpdate *)InputInfo,Info->CurrentY * Info->Width + Info->CurrentX);
ReleaseGIRPort(RPort);
return(GMR_MEACTIVE);
}
else
return(GMR_NOREUSE);
}
STATIC ULONG
InactiveMethod(Class *class,Object *object,struct gpGoInactive *InactiveInfo)
{
MatrixInfo *Info = INST_DATA(class,object);
if(Info->CurrentX != -1 && Info->CurrentY != -1)
{
struct RastPort *RPort;
if(RPort = ObtainGIRPort(InactiveInfo->gpgi_GInfo))
{
SetFont(RPort,Info->Font);
DrawCell(RPort,((struct Gadget *)object)->LeftEdge,((struct Gadget *)object)->TopEdge,InactiveInfo->gpgi_GInfo->gi_DrInfo->dri_Pens,Info,Info->CurrentX,Info->CurrentY,FALSE);
ReleaseGIRPort(RPort);
NotifyIndex(class,object,InactiveInfo->gpgi_GInfo,(struct opUpdate *)InactiveInfo,-1);
}
}
Info->CurrentX = -1;
Info->CurrentY = -1;
return(0);
}
STATIC ULONG
HitTestMethod(Class *class,Object *object,struct gpHitTest *HitInfo)
{
MatrixInfo *Info = INST_DATA(class,object);
if(HitInfo->gpht_Mouse.X < Info->PixelWidth && HitInfo->gpht_Mouse.Y < Info->PixelHeight)
return(GMR_GADGETHIT);
else
return(0);
}
STATIC ULONG SAVE_DS ASM
Dispatch(REG(a0) Class *class,REG(a2) Object *object,REG(a1) Msg msg)
{
switch(msg->MethodID)
{
case OM_NEW:
return(NewMethod(class,object,(struct opSet *)msg));
case OM_UPDATE:
case OM_SET:
if(SetMethod(class,object,(struct opSet *)msg))
return(TRUE);
else
break;
case GM_RENDER:
return(RenderMethod(class,object,(struct gpRender *)msg));
case GM_HITTEST:
return(HitTestMethod(class,object,(struct gpHitTest *)msg));
case GM_GOINACTIVE:
return(InactiveMethod(class,object,(struct gpGoInactive *)msg));
case GM_GOACTIVE:
return(ActiveMethod(class,object,(struct gpInput *)msg));
case GM_HANDLEINPUT:
return(InputMethod(class,object,(struct gpInput *)msg));
case OM_DISPOSE:
DisposeMethod(class,object,msg);
}
return(DoSuperMethodA(class,object,msg));
}
STATIC VOID
DeleteMatrixClass(VOID)
{
if(MatrixClass)
{
FreeClass(MatrixClass);
MatrixClass = NULL;
}
}
STATIC Class *
CreateMatrixClass(VOID)
{
if(MatrixClass = MakeClass(NULL,GADGETCLASS,NULL,sizeof(MatrixInfo),0))
InitHook(&MatrixClass->cl_Dispatcher,(HOOKFUNC)Dispatch,NULL);
return(MatrixClass);
}
VOID
CloseMatrixWindow()
{
CheckItem(MEN_MATRIX_WINDOW,FALSE);
if(MatrixWindow)
{
PutWindowInfo(WINDOW_CHARTAB,MatrixWindow->LeftEdge,MatrixWindow->TopEdge,MatrixWindow->Width,MatrixWindow->Height);
ClearMenuStrip(MatrixWindow);
CloseWindowSafely(MatrixWindow);
MatrixWindow = NULL;
}
if(MatrixGadget)
{
DisposeObject(MatrixGadget);
MatrixGadget = NULL;
}
DeleteMatrixClass();
}
BOOL
DispatchMatrixWindow(ULONG *MsgClass,UWORD MsgCode,ULONG MsgQualifier,UBYTE Char)
{
if(MatrixWindow)
{
switch(*MsgClass)
{
case IDCMP_RAWKEY:
if(!(MsgCode & IECODE_UP_PREFIX) && !(MsgQualifier & IEQUALIFIER_REPEAT) && !(MsgCode >= CURSOR_UP_CODE && MsgCode <= F10_CODE) && !(MsgCode >= HELP_CODE && MsgCode <= RAMIGA_CODE))
{
SetGadgetAttrs((struct Gadget *)MatrixGadget,MatrixWindow,NULL,
MIA_Index, Char,
TAG_DONE);
Delay(TICKS_PER_SECOND / 10);
SetGadgetAttrs((struct Gadget *)MatrixGadget,MatrixWindow,NULL,
MIA_Index, -1,
TAG_DONE);
}
break;
case IDCMP_CLOSEWINDOW:
*MsgClass = 0;
return(TRUE);
case IDCMP_GADGETUP:
*MsgClass = 0;
Char = MsgCode;
SerWrite(&Char,1);
break;
case IDCMP_IDCMPUPDATE:
*MsgClass = 0;
if((WORD)MsgCode < 0)
SetWindowTitles(MatrixWindow,LocaleString(MSG_MATRIX_WINDOW_TITLE),(STRPTR)~0);
else
{
UBYTE OctalBuffer[6],BinBuffer[10];
LONG i,Code;
OctalBuffer[0] = '0';
for(Code = MsgCode, i = 0 ; i < 3 ; i++)
{
OctalBuffer[2 - i + 1] = '0' + (Code & 7);
Code = Code >> 3;
}
OctalBuffer[4] = 0;
BinBuffer[0] = '%';
for(Code = MsgCode, i = 0 ; i < 8 ; i++)
{
BinBuffer[7 - i + 1] = '0' + (Code & 1);
Code = Code >> 1;
}
BinBuffer[9] = 0;
LimitedSPrintf(sizeof(TitleBuffer),TitleBuffer,"%s [%ld · $%02lx · %s · %s]",LocaleString(MSG_MATRIX_WINDOW_TITLE),MsgCode,MsgCode,OctalBuffer,BinBuffer);
SetWindowTitles(MatrixWindow,TitleBuffer,(STRPTR)~0);
}
break;
}
}
return(FALSE);
}
struct Window *
OpenMatrixWindow(struct Window *Parent)
{
if(MatrixWindow)
{
WindowToFront(MatrixWindow);
ActivateWindow(MatrixWindow);
return(MatrixWindow);
}
else
{
LONG i,MaxWidth,Width,Height;
struct RastPort RastPort;
struct TextFont *Font;
InitRastPort(&RastPort);
Font = OpenFont((struct TextAttr *)&TextAttr);
SetFont(&RastPort,Font);
for(i = 0, MaxWidth = 0 ; i < 256 ; i++)
{
if((Width = TextLength(&RastPort,CharCodes[i],strlen(CharCodes[i]))) > MaxWidth)
MaxWidth = Width;
}
Width = 2 + MaxWidth + 2;
Height = 2 + RastPort.TxHeight + 2;
if(Parent->WScreen->WBorTop + Parent->WScreen->Font->ta_YSize + 1 + Parent->WScreen->WBorBottom + 16 * Height > Parent->WScreen->Height || Parent->WScreen->WBorLeft + 16 * Width + Parent->WScreen->WBorRight > Parent->WScreen->Width)
{
DisplayBeep(Parent->WScreen);
return(NULL);
}
if(CreateMatrixClass())
{
STATIC Tag Map[] = { MIA_Index, ICSPECIAL_CODE, TAG_DONE };
if(MatrixGadget = NewObject(MatrixClass,NULL,
GA_Left, Parent->WScreen->WBorLeft + 2,
GA_Top, Parent->WScreen->WBorTop + Parent->WScreen->Font->ta_YSize + 1 + 2,
GA_Width, 16 * Width,
GA_Height, 16 * Height,
GA_RelVerify, TRUE,
ICA_TARGET, ICTARGET_IDCMP,
ICA_MAP, Map,
MIA_Width, 16,
MIA_Height, 16,
MIA_CellWidth, Width,
MIA_CellHeight, Height,
MIA_Labels, CharCodes,
MIA_NumLabels, 256,
MIA_Font, &TextAttr,
TAG_DONE))
{
LONG Left,Top,DummyWidth,DummyHeight;
Left = Top = DummyWidth = DummyHeight = 0;
GetWindowInfo(WINDOW_CHARTAB,&Left,&Top,&DummyWidth,&DummyHeight,0,0);
if(MatrixWindow = OpenWindowTags(NULL,
WA_Top, Left,
WA_Left, Top,
WA_Title, LocaleString(MSG_MATRIX_WINDOW_TITLE),
WA_DepthGadget, TRUE,
WA_CloseGadget, TRUE,
WA_DragBar, TRUE,
WA_InnerWidth, 2 + (Width * 16) + 2,
WA_InnerHeight, 2 + (Height * 16) + 2,
WA_Activate, TRUE,
WA_Gadgets, MatrixGadget,
OpenWindowTag, Parent->WScreen,
WA_NewLookMenus, TRUE,
BackfillTag, &BackfillHook,
WA_SimpleRefresh, TRUE,
AmigaGlyph ? WA_AmigaKey : TAG_IGNORE, AmigaGlyph,
CheckGlyph ? WA_Checkmark : TAG_IGNORE, CheckGlyph,
TAG_DONE))
{
MatrixWindow->UserPort = Parent->UserPort;
if(ModifyIDCMP(MatrixWindow,Parent->IDCMPFlags | IDCMP_CLOSEWINDOW | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | IDCMP_REFRESHWINDOW))
{
SetMenuStrip(MatrixWindow,Menu);
CheckItem(MEN_MATRIX_WINDOW,TRUE);
return(MatrixWindow);
}
MatrixWindow->UserPort = NULL;
CloseWindow(MatrixWindow);
MatrixWindow = NULL;
}
DisposeObject(MatrixGadget);
MatrixGadget = NULL;
}
DeleteMatrixClass();
}
CheckItem(MEN_MATRIX_WINDOW,FALSE);
return(NULL);
}
}